// routes/weather.js

const Joi = require("joi");
const Config = require("../config");
const _request = require("../utils/request");
const weatherInfo = require("../utils/weatherInfo");

const GROUP_NAME = "weather";
//接口来自心知天气 https://www.seniverse.com/doc
module.exports = [
    {
        method: "get",
        path: `/${GROUP_NAME}/getWeatherNow`,
        handler: async (request, reply) => {
            let result = await _request.get('https://api.seniverse.com/v3/weather/now.json',{
                'key': Config.xzWeatherSecret,
                'location': request.query.location,
                'language': request.query.language,
                'unit': request.query.unit,
            });
            if (result.data) {
                if (!!result.data.errcode && !!result.data.errmsg) {
                    reply({
                        errorCode: -1,
                        errorMessage: result.data.errmsg
                    });
                } else {
                    result.data.results.map(item => {
                        item.now && item.now.code && item.now.code !== '' && (function() {
                            item.now.zhHans = weatherInfo[item.now.code].zhHans;
                            item.now.en = weatherInfo[item.now.code].en;
                            item.now.iconPath = `http://${Config.proxyHost}:${Config.proxyPort}${Config.weatherImgFolder}/${weatherInfo[item.now.code].iconPath}`;
                        })();
                    })
                    reply({
                        errorCode: 0,
                        errorMessage: "success",
                        result: result.data
                    });
                }
            }
        },
        config: {
            tags: ["api", GROUP_NAME],
            description: "获取天气实况",
            auth: false, // 约定此接口不参与 JWT 的用户验证，会结合下面的 hapi-auth-jwt 来使用
            validate: {
                query: {
                    location: Joi.string().required().description('所查询的位置(参数值范围： 城市ID 例如：location=WX4FBXXFKE4F||城市中文名 例如：location=北京||省市名称组合 例如：location=辽宁朝阳、location=北京朝阳||城市拼音/英文名 例如：location=beijing（如拼音相同城市，可在之前加省份和空格，例：shanxi yulin）||经纬度 例如：location=39.93:116.40（格式是 纬度:经度，英文冒号分隔）||IP地址 例如：location=220.181.111.86（某些IP地址可能无法定位到城市）||“ip”两个字母 自动识别请求IP地址，例如：location=ip)'),
                    language: Joi.string().description('语言 (可选)：(参数值范围： zh-Hans 简体中文||zh-Hant 繁体中文||en 英文||ja 日语||de 德语||fr 法语||es 西班牙语||pt 葡萄牙语||hi 印地语（印度官方语言之一）||id 印度尼西亚语||ru 俄语||th 泰语||ar 阿拉伯语||默认值：zh-Hans)'),
                    unit: Joi.string().description('单位 (可选) 参数值范围： c 当参数为c时，温度c、风速km/h、能见度km、气压mb||f 当参数为f时，温度f、风速mph、能见度mile、气压inch||默认值：c')
                }
            },
            response: {
                schema: Joi.object({
                    errorCode: Joi.number().allow(0).description("错误码").example(0),
                    errorMessage: Joi.string().description("错误信息").example("success"),
                    result: Joi.object({
                        results: Joi.array().items(Joi.object({
                            location: Joi.object({
                                id: Joi.string().example("WTSQQYHVQ973").description("地址id"),
                                name: Joi.string().example("南京").description("地址"),
                                country: Joi.string().example("CN").description("城市"),
                                path: Joi.string().example("南京,南京,江苏,中国").description("具体地址"),
                                timezone: Joi.string().example("Asia/Shanghai").description("时区"),
                                timezone_offset: Joi.string().example("+08:00").description("时区偏移")
                            }),
                            now: Joi.object({
                                text: Joi.string().example("阴").description("天气文本"),
                                code: Joi.string().example("9").description("天气代码"),
                                temperature: Joi.string().example("4").description("气温"),
                                zhHans: Joi.string().example("阴").description("中文天气文本"),
                                en: Joi.string().example("阴").description("英文天气文本"),
                                iconPath: Joi.string().example("http://127.0.0.1:80/weatherImgs/9.png").description("天气图标地址")
                            }),
                            last_update: Joi.string().example("2018-12-27T17:05:00+08:00").description("最近更新时间")
                        })).min(0),
                    }).description("结果")
                })
            }
        }
    },{
        method: "get",
        path: `/${GROUP_NAME}/getLivingSuggestion`,
        handler: async (request, reply) => {
            let result = await _request.get('https://api.seniverse.com/v3/life/suggestion.json',{
                'key': Config.xzWeatherSecret,
                'location': request.query.location,
                'language': request.query.language,
            });
            if (result.data) {
                if (!!result.data.errcode && !!result.data.errmsg) {
                    reply({
                        errorCode: -1,
                        errorMessage: result.data.errmsg
                    });
                } else {
                    reply({
                        errorCode: 0,
                        errorMessage: "success",
                        result: result.data
                    });
                }
            }
        },
        config: {
            tags: ["api", GROUP_NAME],
            description: "获取生活指数",
            auth: false, // 约定此接口不参与 JWT 的用户验证，会结合下面的 hapi-auth-jwt 来使用
            validate: {
                query: {
                    location: Joi.string().required().description('所查询的位置(参数值范围： 城市ID 例如：location=WX4FBXXFKE4F||城市中文名 例如：location=北京||省市名称组合 例如：location=辽宁朝阳、location=北京朝阳||城市拼音/英文名 例如：location=beijing（如拼音相同城市，可在之前加省份和空格，例：shanxi yulin）||经纬度 例如：location=39.93:116.40（格式是 纬度:经度，英文冒号分隔）||IP地址 例如：location=220.181.111.86（某些IP地址可能无法定位到城市）||“ip”两个字母 自动识别请求IP地址，例如：location=ip)'),
                    language: Joi.string().description('语言 (可选)：(参数值范围： zh-Hans 简体中文||zh-Hant 繁体中文||en 英文||ja 日语||de 德语||fr 法语||es 西班牙语||pt 葡萄牙语||hi 印地语（印度官方语言之一）||id 印度尼西亚语||ru 俄语||th 泰语||ar 阿拉伯语||默认值：zh-Hans)'),
                }
            }
        }
    },{
        method: "get",
        path: `/${GROUP_NAME}/getDaily`,
        handler: async (request, reply) => {
            let result = await _request.get('https://api.seniverse.com/v3/weather/daily.json',{
                'key': Config.xzWeatherSecret,
                'location': request.query.location,
                'language': request.query.language,
                'unit': request.query.unit,
                'start': request.query.start,
                'days': request.query.days,
            });
            if (result.data) {
                if (!!result.data.errcode && !!result.data.errmsg) {
                    reply({
                        errorCode: -1,
                        errorMessage: result.data.errmsg
                    });
                } else {
                    reply({
                        errorCode: 0,
                        errorMessage: "success",
                        result: result.data
                    });
                }
            }
        },
        config: {
            tags: ["api", GROUP_NAME],
            description: "获取逐日天气预报和昨日天气",
            auth: false, // 约定此接口不参与 JWT 的用户验证，会结合下面的 hapi-auth-jwt 来使用
            validate: {
                query: {
                    location: Joi.string().required().description('所查询的位置(参数值范围： 城市ID 例如：location=WX4FBXXFKE4F||城市中文名 例如：location=北京||省市名称组合 例如：location=辽宁朝阳、location=北京朝阳||城市拼音/英文名 例如：location=beijing（如拼音相同城市，可在之前加省份和空格，例：shanxi yulin）||经纬度 例如：location=39.93:116.40（格式是 纬度:经度，英文冒号分隔）||IP地址 例如：location=220.181.111.86（某些IP地址可能无法定位到城市）||“ip”两个字母 自动识别请求IP地址，例如：location=ip)'),
                    language: Joi.string().description('语言 (可选)：(参数值范围： zh-Hans 简体中文||zh-Hant 繁体中文||en 英文||ja 日语||de 德语||fr 法语||es 西班牙语||pt 葡萄牙语||hi 印地语（印度官方语言之一）||id 印度尼西亚语||ru 俄语||th 泰语||ar 阿拉伯语||默认值：zh-Hans)'),
                    unit: Joi.string().description('单位 (可选) 参数值范围： c 当参数为c时，温度c、风速km/h、能见度km、气压mb||f 当参数为f时，温度f、风速mph、能见度mile、气压inch||默认值：c'),
                    start: Joi.number().description('起始时间（可选）参数值范围：日期 例如：start=2015/10/1||整数 例如：start=-2 代表前天、start=-1 代表昨天、start=0 代表今天、start=1 代表明天'),
                    days: Joi.number().description('天数 (可选) 参数值范围：整数 例如：days=3 代表3天、days=7 代表7天')
                }
            },
            response: {
                schema: Joi.object({
                    errorCode: Joi.number().allow(0).description("错误码").example(0),
                    errorMessage: Joi.string().description("错误信息").example("success"),
                    result: Joi.object({
                        results: Joi.array().items(Joi.object({
                            location: Joi.object({
                                id: Joi.string().example("WTSQQYHVQ973").description("地址id"),
                                name: Joi.string().example("南京").description("地址"),
                                country: Joi.string().example("CN").description("城市"),
                                path: Joi.string().example("南京,南京,江苏,中国").description("具体地址"),
                                timezone: Joi.string().example("Asia/Shanghai").description("时区"),
                                timezone_offset: Joi.string().example("+08:00").description("时区偏移")
                            }),
                            "daily": Joi.array().items(Joi.object({
                                "date": Joi.string().allow("").example("2015-09-20").description("日期"),
                                "text_day": Joi.string().allow("").example("多云").description("白天天气现象文字"),
                                "code_day": Joi.string().allow("").example("4").description("白天天气现象代码"),
                                "text_night": Joi.string().allow("").example("晴").description("晚间天气现象文字"),
                                "code_night": Joi.string().allow("").example("0").description("晚间天气现象代码"),
                                "high": Joi.string().allow("").example("26").description("当天最高温度"),
                                "low": Joi.string().allow("").example("17").description("当天最低温度"),
                                "precip": Joi.string().allow("").example("0").description("降水概率，范围0~100，单位百分比"),
                                "wind_direction": Joi.string().allow("").example("").description("风向文字"),
                                "wind_direction_degree": Joi.string().allow("").example("255").description("风向角度，范围0~360"),
                                "wind_speed": Joi.string().allow("").example("9.66").description("风速，单位km/h（当unit=c时）、mph（当unit=f时）"),
                                "wind_scale": Joi.string().allow("").example("").description("风力等级")
                            })).min(0),
                            last_update: Joi.string().example("2018-12-27T17:05:00+08:00").description("最近更新时间")
                        })).min(0),
                    }).description("结果")
                })
            }
        }
    }
];
